/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package isd.general.rn;

import isd.general.dao.FormularioDAO;
import isd.general.excepciones.ExcepcionGeneralSistema;
import isd.general.modelo.GR_Comprobante;
import isd.general.modelo.GR_Formulario;
import isd.general.modelo.GR_FormularioPK;
import isd.general.modelo.GR_FormularioPorSituacionIVA;
import isd.inventario.modelo.ST_Comprobante;
import isd.inventario.modelo.ST_TipoMovimiento;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.ejb.Stateless;

/**
 *
 * @author Claudio
 */
@Stateless
public class FormularioRN {

    @EJB private FormularioDAO formularioDAO;
    @EJB private FormularioPorSituacionIVARN formularioPorSituacionIVARN;

    public GR_Formulario getFormulario(GR_FormularioPK idPK){

        return formularioDAO.getFormulario(idPK);
    }

    public void guardar(GR_Formulario formulario) throws Exception {

        GR_FormularioPK idPK = new GR_FormularioPK(formulario.getModfor(),formulario.getCodfor());

        if(formularioDAO.getFormulario(idPK)==null){
            formularioDAO.crear(formulario);
        }else{
            formularioDAO.editar(formulario);
        }
    }

    public GR_Formulario getFormularioStock(ST_Comprobante comprobante) throws ExcepcionGeneralSistema {

        /**
         * Validamos el tipo de movimiento para buscar el formulario por situacion de iva
         * lo correcto es verificar desde donde registra para ver si se busca la situacion de iva
         */
        GR_FormularioPorSituacionIVA fpsi;

        if(comprobante.getTipoMovimiento()== ST_TipoMovimiento.A
                || comprobante.getTipoMovimiento()== ST_TipoMovimiento.T){

            fpsi = formularioPorSituacionIVARN.getFormulario(comprobante.getIdPK().getModcom(),
                                                                             comprobante.getIdPK().getCodcom(),
                                                                             "X");
        }else{
            /**
             * Aqui se deberia buscar la situacion de iva del cliente o del proveedor
             */
            System.out.println("Falta implementación");
            fpsi = null;
        }

        if(fpsi==null) throw new ExcepcionGeneralSistema("No se encontró formulario");
        return  fpsi.getFormulario();
    }

     public GR_Formulario getFormulario(GR_Comprobante comprobante) throws ExcepcionGeneralSistema {

        /**
         * Validamos el tipo de movimiento para buscar el formulario por situacion de iva
         * lo correcto es verificar desde donde registra para ver si se busca la situacion de iva
         */
        GR_FormularioPorSituacionIVA fpsi;
        fpsi = formularioPorSituacionIVARN.getFormulario(comprobante.getIdPK().getModcom(),
                                                                             comprobante.getIdPK().getCodcom(),
                                                                             "X");
        
        if(fpsi==null) throw new ExcepcionGeneralSistema("No se encontró formulario por situacion de iva");
        return  fpsi.getFormulario();
    }

    public void actualizarUltimoNumero(GR_Formulario formulario) throws Exception {

        formulario.setUltimoNumero(formulario.getUltimoNumero() + 1);
        guardar(formulario);
    }

    public int tomarProximoNumero(GR_Formulario formulario) throws ExcepcionGeneralSistema {
        try {
            GR_FormularioPK idPK = new GR_FormularioPK(formulario.getModfor(), formulario.getCodfor());
            GR_Formulario f = getFormulario(idPK);
            if (f == null) {
                throw new ExcepcionGeneralSistema("No se encontró formulario " + formulario.getCodfor() + " - " + formulario.getDescripcion());
            }
            int ultimoNumero = f.getUltimoNumero();
            ultimoNumero++;
            f.setUltimoNumero(ultimoNumero);
            guardar(f);
            return ultimoNumero;
        } catch (Exception ex) {
            Logger.getLogger(FormularioRN.class.getName()).log(Level.SEVERE,
                    "No es posible actualizar formulario ", ex);

            return 0;
        }


    }
}
